home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 September / Amiga Games Extra CD-ROM 9-1996.iso / userbox / publicdomain / vim-4.2 / src / digraph.c < prev    next >
C/C++ Source or Header  |  1996-06-09  |  14KB  |  552 lines

  1. /* vi:set ts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved        by Bram Moolenaar
  4.  *
  5.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  6.  * Do ":help credits" in Vim to see a list of people who contributed.
  7.  */
  8.  
  9. /*
  10.  * digraph.c: code for digraphs
  11.  */
  12.  
  13. #include "vim.h"
  14. #include "globals.h"
  15. #include "proto.h"
  16. #include "option.h"
  17.  
  18. #ifdef DIGRAPHS
  19.  
  20. static int getexactdigraph __ARGS((int, int, int));
  21. static void printdigraph __ARGS((char_u *));
  22.  
  23. static char_u    (*digraphnew)[3];            /* pointer to added digraphs */
  24. static int        digraphcount = 0;            /* number of added digraphs */
  25.  
  26. #if defined(MSDOS) || defined(WIN32) || defined(OS2)
  27. char_u    digraphdefault[][3] =         /* standard MSDOS digraphs */
  28.        {{'C', ',', 128},    /* ~@ (SAS C can't handle the real char) */
  29.         {'u', '"', 129},    /*  */
  30.         {'e', '\'', 130},    /* ‚ */
  31.         {'a', '^', 131},    /* ƒ */
  32.         {'a', '"', 132},    /* „ */
  33.         {'a', '`', 133},    /* … */
  34.         {'a', '@', 134},    /* † */
  35.         {'c', ',', 135},    /* ~G (SAS C can't handle the real char) */
  36.         {'e', '^', 136},    /* ~H (SAS C can't handle the real char) */
  37.         {'e', '"', 137},    /* ‰ */
  38.         {'e', '`', 138},    /* Š */
  39.         {'i', '"', 139},    /* ‹ */
  40.         {'i', '^', 140},    /* Œ */
  41.         {'i', '`', 141},    /*  */
  42.         {'A', '"', 142},    /* Ž */
  43.         {'A', '@', 143},    /*  */
  44.         {'E', '\'', 144},    /*  */
  45.         {'a', 'e', 145},    /* ‘ */
  46.         {'A', 'E', 146},    /* ’ */
  47.         {'o', '^', 147},    /* “ */
  48.         {'o', '"', 148},    /* ” */
  49.         {'o', '`', 149},    /* • */
  50.         {'u', '^', 150},    /* – */
  51.         {'u', '`', 151},    /* — */
  52.         {'y', '"', 152},    /* ˜ */
  53.         {'O', '"', 153},    /* ™ */
  54.         {'U', '"', 154},    /* š */
  55.         {'c', '|', 155},    /* › */
  56.         {'$', '$', 156},    /* œ */
  57.         {'Y', '-', 157},    /* ~] (SAS C can't handle the real char) */
  58.         {'P', 't', 158},    /* ž */
  59.         {'f', 'f', 159},    /* Ÿ */
  60.         {'a', '\'', 160},    /*   */
  61.         {'i', '\'', 161},    /* ¡ */
  62.         {'o', '\'', 162},    /* ¢ */
  63.         {'u', '\'', 163},    /* xx (SAS C can't handle the real char) */
  64.         {'n', '~', 164},    /* ¤ */
  65.         {'N', '~', 165},    /* ¥ */
  66.         {'a', 'a', 166},    /* ¦ */
  67.         {'o', 'o', 167},    /* § */
  68.         {'~', '?', 168},    /* ¨ */
  69.         {'-', 'a', 169},    /* © */
  70.         {'a', '-', 170},    /* ª */
  71.         {'1', '2', 171},    /* « */
  72.         {'1', '4', 172},    /* ¬ */
  73.         {'~', '!', 173},    /* ­ */
  74.         {'<', '<', 174},    /* ® */
  75.         {'>', '>', 175},    /* ¯ */
  76.  
  77.         {'s', 's', 225},    /* á */
  78.         {'j', 'u', 230},    /* æ */
  79.         {'o', '/', 237},    /* í */
  80.         {'+', '-', 241},    /* ñ */
  81.         {'>', '=', 242},    /* ò */
  82.         {'<', '=', 243},    /* ó */
  83.         {':', '-', 246},    /* ö */
  84.         {'~', '~', 247},    /* ÷ */
  85.         {'~', 'o', 248},    /* ø */
  86.         {'2', '2', 253},    /* ý */
  87.         {NUL, NUL, NUL}
  88.         };
  89.  
  90. #else    /* !MSDOS && !WIN32 */
  91. # ifdef MINT
  92. char_u    digraphdefault[][3] =         /* standard ATARI digraphs */
  93.        {{'C', ',', 128},    /* ~@ */
  94.         {'u', '"', 129},    /*  */
  95.         {'e', '\'', 130},    /* ‚ */
  96.         {'a', '^', 131},    /* ƒ */
  97.         {'a', '"', 132},    /* „ */
  98.         {'a', '`', 133},    /* … */
  99.         {'a', '@', 134},    /* † */
  100.         {'c', ',', 135},    /* ~G */
  101.         {'e', '^', 136},    /* ~H */
  102.         {'e', '"', 137},    /* ‰ */
  103.         {'e', '`', 138},    /* Š */
  104.         {'i', '"', 139},    /* ‹ */
  105.         {'i', '^', 140},    /* Œ */
  106.         {'i', '`', 141},    /*  */
  107.         {'A', '"', 142},    /* Ž */
  108.         {'A', '@', 143},    /*  */
  109.         {'E', '\'', 144},    /*  */
  110.         {'a', 'e', 145},    /* ‘ */
  111.         {'A', 'E', 146},    /* ’ */
  112.         {'o', '^', 147},    /* “ */
  113.         {'o', '"', 148},    /* ” */
  114.         {'o', '`', 149},    /* • */
  115.         {'u', '^', 150},    /* – */
  116.         {'u', '`', 151},    /* — */
  117.         {'y', '"', 152},    /* ˜ */
  118.         {'O', '"', 153},    /* ™ */
  119.         {'U', '"', 154},    /* š */
  120.            {'c', '|', 155},    /* › */
  121.            {'$', '$', 156},    /* œ */
  122.            {'Y', '-', 157},    /* ~] */
  123.            {'s', 's', 158},    /* ž */
  124.         {'f', 'f', 159},    /* Ÿ */
  125.         {'a', '\'', 160},    /*   */
  126.         {'i', '\'', 161},    /* ¡ */
  127.         {'o', '\'', 162},    /* ¢ */
  128.         {'u', '\'', 163},    /* £ */
  129.         {'n', '~', 164},    /* ¤ */
  130.         {'N', '~', 165},    /* ¥ */
  131.         {'a', 'a', 166},    /* ¦ */
  132.         {'o', 'o', 167},    /* § */
  133.         {'~', '?', 168},    /* ¨ */
  134.         {'-', 'a', 169},    /* © */
  135.         {'a', '-', 170},    /* ª */
  136.         {'1', '2', 171},    /* « */
  137.         {'1', '4', 172},    /* ¬ */
  138.         {'~', '!', 173},    /* ­ */
  139.         {'<', '<', 174},    /* ® */
  140.         {'>', '>', 175},    /* ¯ */
  141.         {'j', 'u', 230},    /* æ */
  142.         {'o', '/', 237},    /* í */
  143.         {'+', '-', 241},    /* ñ */
  144.         {'>', '=', 242},    /* ò */
  145.         {'<', '=', 243},    /* ó */
  146.         {':', '-', 246},    /* ö */
  147.         {'~', '~', 247},    /* ÷ */
  148.         {'~', 'o', 248},    /* ø */
  149.         {'2', '2', 253},    /* ý */
  150.         {NUL, NUL, NUL}
  151.         };
  152.  
  153. # else    /* !MINT */
  154. #  ifdef _INCLUDE_HPUX_SOURCE
  155.  
  156. char_u    digraphdefault[][3] =         /* default HPUX digraphs */
  157.        {{'A', '`', 161},    /* ¡ */
  158.         {'A', '^', 162},    /* ¢ */
  159.         {'E', '`', 163},    /* £ */
  160.         {'E', '^', 164},    /* ¤ */
  161.         {'E', '"', 165},    /* ¥ */
  162.         {'I', '^', 166},    /* ¦ */
  163.         {'I', '"', 167},    /* § */
  164.         {'\'', '\'', 168},    /* ¨ */
  165.         {'`', '`', 169},    /* © */
  166.         {'^', '^', 170},    /* ª */
  167.         {'"', '"', 171},    /* « */
  168.         {'~', '~', 172},    /* ¬ */
  169.         {'U', '`', 173},    /* ­ */
  170.         {'U', '^', 174},    /* ® */
  171.         {'L', '=', 175},    /* ¯ */
  172.         {'~', '_', 176},    /* ° */
  173.         {'Y', '\'', 177},    /* ± */
  174.         {'y', '\'', 178},    /* ² */
  175.         {'~', 'o', 179},    /* ³ */
  176.         {'C', ',', 180},    /* ´ */
  177.         {'c', ',', 181},    /* µ */
  178.         {'N', '~', 182},    /* ¶ */
  179.         {'n', '~', 183},    /* · */
  180.         {'~', '!', 184},    /* ¸ */
  181.         {'~', '?', 185},    /* ¹ */
  182.         {'o', 'x', 186},    /* º */
  183.         {'L', '-', 187},    /* » */
  184.         {'Y', '=', 188},    /* ¼ */
  185.         {'p', 'p', 189},    /* ½ */
  186.         {'f', 'l', 190},    /* ¾ */
  187.         {'c', '|', 191},    /* ¿ */
  188.         {'a', '^', 192},    /* À */
  189.         {'e', '^', 193},    /* Á */
  190.         {'o', '^', 194},    /* Â */
  191.         {'u', '^', 195},    /* Ã */
  192.         {'a', '\'', 196},    /* Ä */
  193.         {'e', '\'', 197},    /* Å */
  194.         {'o', '\'', 198},    /* Æ */
  195.         {'u', '\'', 199},    /* Ç */
  196.         {'a', '`', 200},    /* È */
  197.         {'e', '`', 201},    /* É */
  198.         {'o', '`', 202},    /* Ê */
  199.         {'u', '`', 203},    /* Ë */
  200.         {'a', '"', 204},    /* Ì */
  201.         {'e', '"', 205},    /* Í */
  202.         {'o', '"', 206},    /* Î */
  203.         {'u', '"', 207},    /* Ï */
  204.         {'A', 'o', 208},    /* Ð */
  205.         {'i', '^', 209},    /* Ñ */
  206.         {'O', '/', 210},    /* Ò */
  207.         {'A', 'E', 211},    /* Ó */
  208.         {'a', 'o', 212},    /* Ô */
  209.         {'i', '\'', 213},    /* Õ */
  210.         {'o', '/', 214},    /* Ö */
  211.         {'a', 'e', 215},    /* × */
  212.         {'A', '"', 216},    /* Ø */
  213.         {'i', '`', 217},    /* Ù */
  214.         {'O', '"', 218},    /* Ú */
  215.         {'U', '"', 219},    /* Û */
  216.         {'E', '\'', 220},    /* Ü */
  217.         {'i', '"', 221},    /* Ý */
  218.         {'s', 's', 222},    /* Þ */
  219.         {'O', '^', 223},    /* ß */
  220.         {'A', '\'', 224},    /* à */
  221.         {'A', '~', 225},    /* á */
  222.         {'a', '~', 226},    /* â */
  223.         {'D', '-', 227},    /* ã */
  224.         {'d', '-', 228},    /* ä */
  225.         {'I', '\'', 229},    /* å */
  226.         {'I', '`', 230},    /* æ */
  227.         {'O', '\'', 231},    /* ç */
  228.         {'O', '`', 232},    /* è */
  229.         {'O', '~', 233},    /* é */
  230.         {'o', '~', 234},    /* ê */
  231.         {'S', '~', 235},    /* ë */
  232.         {'s', '~', 236},    /* ì */
  233.         {'U', '\'', 237},    /* í */
  234.         {'Y', '"', 238},    /* î */
  235.         {'y', '"', 239},    /* ï */
  236.         {'p', '-', 240},    /* ð */
  237.         {'p', '~', 241},    /* ñ */
  238.         {'~', '.', 242},    /* ò */
  239.         {'j', 'u', 243},    /* ó */
  240.         {'P', 'p', 244},    /* ô */
  241.         {'3', '4', 245},    /* õ */
  242.         {'-', '-', 246},    /* ö */
  243.         {'1', '4', 247},    /* ÷ */
  244.         {'1', '2', 248},    /* ø */
  245.         {'a', '_', 249},    /* ù */
  246.         {'o', '_', 250},    /* ú */
  247.         {'<', '<', 251},    /* û */
  248.         {'x', 'x', 252},    /* ü */
  249.         {'>', '>', 253},    /* ý */
  250.         {'+', '-', 254},    /* þ */
  251.         {'n', 'u', 255},    /* (char excluded, is EOF on some systems */
  252.         {NUL, NUL, NUL}
  253.         };
  254.  
  255. #  else    /* _INCLUDE_HPUX_SOURCE */
  256.  
  257. char_u    digraphdefault[][3] =         /* standard ISO digraphs */
  258.        {{'~', '!', 161},    /* ¡ */
  259.         {'c', '|', 162},    /* ¢ */
  260.         {'$', '$', 163},    /* £ */
  261.         {'o', 'x', 164},    /* ¤ */
  262.         {'Y', '-', 165},    /* ¥ */
  263.         {'|', '|', 166},    /* ¦ */
  264.         {'p', 'a', 167},    /* § */
  265.         {'"', '"', 168},    /* ¨ */
  266.         {'c', 'O', 169},    /* © */
  267.         {'a', '-', 170},    /* ª */
  268.         {'<', '<', 171},    /* « */
  269.         {'-', ',', 172},    /* ¬ */
  270.         {'-', '-', 173},    /* ­ */
  271.         {'r', 'O', 174},    /* ® */
  272.         {'-', '=', 175},    /* ¯ */
  273.         {'~', 'o', 176},    /* ° */
  274.         {'+', '-', 177},    /* ± */
  275.         {'2', '2', 178},    /* ² */
  276.         {'3', '3', 179},    /* ³ */
  277.         {'\'', '\'', 180},    /* ´ */
  278.         {'j', 'u', 181},    /* µ */
  279.         {'p', 'p', 182},    /* ¶ */
  280.         {'~', '.', 183},    /* · */
  281.         {',', ',', 184},    /* ¸ */
  282.         {'1', '1', 185},    /* ¹ */
  283.         {'o', '-', 186},    /* º */
  284.         {'>', '>', 187},    /* » */
  285.         {'1', '4', 188},    /* ¼ */
  286.         {'1', '2', 189},    /* ½ */
  287.         {'3', '4', 190},    /* ¾ */
  288.         {'~', '?', 191},    /* ¿ */
  289.         {'A', '`', 192},    /* À */
  290.         {'A', '\'', 193},    /* Á */
  291.         {'A', '^', 194},    /* Â */
  292.         {'A', '~', 195},    /* Ã */
  293.         {'A', '"', 196},    /* Ä */
  294.         {'A', '@', 197},    /* Å */
  295.         {'A', 'E', 198},    /* Æ */
  296.         {'C', ',', 199},    /* Ç */
  297.         {'E', '`', 200},    /* È */
  298.         {'E', '\'', 201},    /* É */
  299.         {'E', '^', 202},    /* Ê */
  300.         {'E', '"', 203},    /* Ë */
  301.         {'I', '`', 204},    /* Ì */
  302.         {'I', '\'', 205},    /* Í */
  303.         {'I', '^', 206},    /* Î */
  304.         {'I', '"', 207},    /* Ï */
  305.         {'D', '-', 208},    /* Ð */
  306.         {'N', '~', 209},    /* Ñ */
  307.         {'O', '`', 210},    /* Ò */
  308.         {'O', '\'', 211},    /* Ó */
  309.         {'O', '^', 212},    /* Ô */
  310.         {'O', '~', 213},    /* Õ */
  311.         {'O', '"', 214},    /* Ö */
  312.         {'/', '\\', 215},    /* × */
  313.         {'O', '/', 216},    /* Ø */
  314.         {'U', '`', 217},    /* Ù */
  315.         {'U', '\'', 218},    /* Ú */
  316.         {'U', '^', 219},    /* Û */
  317.         {'U', '"', 220},    /* Ü */
  318.         {'Y', '\'', 221},    /* Ý */
  319.         {'I', 'p', 222},    /* Þ */
  320.         {'s', 's', 223},    /* ß */
  321.         {'a', '`', 224},    /* à */
  322.         {'a', '\'', 225},    /* á */
  323.         {'a', '^', 226},    /* â */
  324.         {'a', '~', 227},    /* ã */
  325.         {'a', '"', 228},    /* ä */
  326.         {'a', '@', 229},    /* å */
  327.         {'a', 'e', 230},    /* æ */
  328.         {'c', ',', 231},    /* ç */
  329.         {'e', '`', 232},    /* è */
  330.         {'e', '\'', 233},    /* é */
  331.         {'e', '^', 234},    /* ê */
  332.         {'e', '"', 235},    /* ë */
  333.         {'i', '`', 236},    /* ì */
  334.         {'i', '\'', 237},    /* í */
  335.         {'i', '^', 238},    /* î */
  336.         {'i', '"', 239},    /* ï */
  337.         {'d', '-', 240},    /* ð */
  338.         {'n', '~', 241},    /* ñ */
  339.         {'o', '`', 242},    /* ò */
  340.         {'o', '\'', 243},    /* ó */
  341.         {'o', '^', 244},    /* ô */
  342.         {'o', '~', 245},    /* õ */
  343.         {'o', '"', 246},    /* ö */
  344.         {':', '-', 247},    /* ÷ */
  345.         {'o', '/', 248},    /* ø */
  346.         {'u', '`', 249},    /* ù */
  347.         {'u', '\'', 250},    /* ú */
  348.         {'u', '^', 251},    /* û */
  349.         {'u', '"', 252},    /* ü */
  350.         {'y', '\'', 253},    /* ý */
  351.         {'i', 'p', 254},    /* þ */
  352.         {'y', '"', 255},    /* (char excluded, is EOF on some systems */
  353.         {NUL, NUL, NUL}
  354.         };
  355.  
  356. #  endif    /* _INCLUDE_HPUX_SOURCE */
  357. # endif    /* !MINT */
  358. #endif    /* !MSDOS && !WIN32 */
  359.  
  360. /*
  361.  * handle digraphs after typing a character
  362.  */
  363.     int
  364. do_digraph(c)
  365.     int        c;
  366. {
  367.     static int    backspaced;        /* character before K_BS */
  368.     static int    lastchar;        /* last typed character */
  369.  
  370.     if (c == -1)                /* init values */
  371.     {
  372.         backspaced = -1;
  373.     }
  374.     else if (p_dg)
  375.     {
  376.         if (backspaced >= 0)
  377.             c = getdigraph(backspaced, c, FALSE);
  378.         backspaced = -1;
  379.         if ((c == K_BS || c == Ctrl('H')) && lastchar >= 0)
  380.             backspaced = lastchar;
  381.     }
  382.     lastchar = c;
  383.     return c;
  384. }
  385.  
  386. /*
  387.  * lookup the pair char1, char2 in the digraph tables
  388.  * if no match, return char2
  389.  */
  390.     static int
  391. getexactdigraph(char1, char2, meta)
  392.     int    char1;
  393.     int    char2;
  394.     int    meta;
  395. {
  396.     int        i;
  397.     int        retval;
  398.  
  399.     if (IS_SPECIAL(char1) || IS_SPECIAL(char2))
  400.         return char2;
  401.     retval = 0;
  402.     for (i = 0; ; ++i)            /* search added digraphs first */
  403.     {
  404.         if (i == digraphcount)    /* end of added table, search defaults */
  405.         {
  406.             for (i = 0; digraphdefault[i][0] != 0; ++i)
  407.                 if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
  408.                 {
  409.                     retval = digraphdefault[i][2];
  410.                     break;
  411.                 }
  412.             break;
  413.         }
  414.         if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  415.         {
  416.             retval = digraphnew[i][2];
  417.             break;
  418.         }
  419.     }
  420.  
  421.     if (retval == 0)            /* digraph deleted or not found */
  422.     {
  423.         if (char1 == ' ' && meta)        /* <space> <char> --> meta-char */
  424.             return (char2 | 0x80);
  425.         return char2;
  426.     }
  427.     return retval;
  428. }
  429.  
  430. /*
  431.  * Get digraph.
  432.  * Allow for both char1-char2 and char2-char1
  433.  */
  434.     int
  435. getdigraph(char1, char2, meta)
  436.     int    char1;
  437.     int    char2;
  438.     int    meta;
  439. {
  440.     int        retval;
  441.  
  442.     if (((retval = getexactdigraph(char1, char2, meta)) == char2) &&
  443.                                                            (char1 != char2) &&
  444.                     ((retval = getexactdigraph(char2, char1, meta)) == char1))
  445.         return char2;
  446.     return retval;
  447. }
  448.  
  449. /*
  450.  * put the digraphs in the argument string in the digraph table
  451.  * format: {c1}{c2} char {c1}{c2} char ...
  452.  */
  453.     void
  454. putdigraph(str)
  455.     char_u *str;
  456. {
  457.     int        char1, char2, n;
  458.     char_u    (*newtab)[3];
  459.     int        i;
  460.  
  461.     while (*str)
  462.     {
  463.         str = skipwhite(str);
  464.         if ((char1 = *str++) == 0 || (char2 = *str++) == 0)
  465.             return;
  466.         if (char1 == ESC || char2 == ESC)
  467.         {
  468.             EMSG("Escape not allowed in digraph");
  469.             return;
  470.         }
  471.         str = skipwhite(str);
  472.         if (!isdigit(*str))
  473.         {
  474.             emsg(e_number);
  475.             return;
  476.         }
  477.         n = getdigits(&str);
  478.         if (digraphnew)        /* search the table for existing entry */
  479.         {
  480.             for (i = 0; i < digraphcount; ++i)
  481.                 if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  482.                 {
  483.                     digraphnew[i][2] = n;
  484.                     break;
  485.                 }
  486.             if (i < digraphcount)
  487.                 continue;
  488.         }
  489.         newtab = (char_u (*)[3])alloc(digraphcount * 3 + 3);
  490.         if (newtab)
  491.         {
  492.             vim_memmove((char *)newtab, (char *)digraphnew, 
  493.                                                   (size_t)(digraphcount * 3));
  494.             vim_free(digraphnew);
  495.             digraphnew = newtab;
  496.             digraphnew[digraphcount][0] = char1;
  497.             digraphnew[digraphcount][1] = char2;
  498.             digraphnew[digraphcount][2] = n;
  499.             ++digraphcount;
  500.         }
  501.     }
  502. }
  503.  
  504.     void
  505. listdigraphs()
  506. {
  507.     int        i;
  508.  
  509.     msg_outchar('\n');
  510.     printdigraph(NULL);
  511.     for (i = 0; digraphdefault[i][0] && !got_int; ++i)
  512.     {
  513.         if (getexactdigraph(digraphdefault[i][0], digraphdefault[i][1],
  514.                                                FALSE) == digraphdefault[i][2])
  515.             printdigraph(digraphdefault[i]);
  516.         mch_breakcheck();
  517.     }
  518.     for (i = 0; i < digraphcount && !got_int; ++i)
  519.     {
  520.         printdigraph(digraphnew[i]);
  521.         mch_breakcheck();
  522.     }
  523.     must_redraw = CLEAR;    /* clear screen, because some digraphs may be wrong,
  524.                              * in which case we messed up NextScreen */
  525. }
  526.  
  527.     static void
  528. printdigraph(p)
  529.     char_u *p;
  530. {
  531.     char_u        buf[9];
  532.     static int    len;
  533.  
  534.     if (p == NULL)
  535.         len = 0;
  536.     else if (p[2] != 0)
  537.     {
  538.         if (len > Columns - 11)
  539.         {
  540.             msg_outchar('\n');
  541.             len = 0;
  542.         }
  543.         if (len)
  544.             MSG_OUTSTR("   ");
  545.         sprintf((char *)buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
  546.         msg_outstr(buf);
  547.         len += 11;
  548.     }
  549. }
  550.  
  551. #endif /* DIGRAPHS */
  552.